import pandas as pd

def evaluate_investment(source_data, tittle,time='交易日期'):
    temp = source_data.copy()
    # ===新建一个dataframe保存回测指标
    results = pd.DataFrame()

    # ===计算累积净值
    results.loc[0, '累积净值'] = round(temp[tittle].iloc[-1], 2)

    # ===计算年化收益
    days_held = (temp[time].iloc[-1] - temp[time].iloc[0]).days
    annual_return = (temp[tittle].iloc[-1] / temp[tittle].iloc[0]) ** (250 / days_held) - 1
    results.loc[0, '年化收益'] = str(round(annual_return * 100, 2)) + '%'

    # ===计算最大回撤，最大回撤的含义：《如何通过3行代码计算最大回撤》https://mp.weixin.qq.com/s/Dwt4lkKR_PEnWRprLlvPVw
    # 计算当日之前的资金曲线的最高点
    temp['max2here'] = temp[tittle].expanding().max()
    # 计算到历史最高值到当日的跌幅，drowdwon
    temp['dd2here'] = temp[tittle] / temp['max2here'] - 1
    # 计算最大回撤，以及最大回撤结束时间
    end_date, max_draw_down = tuple(temp.sort_values(by=['dd2here']).iloc[0][[time, 'dd2here']])
    # 计算最大回撤开始时间
    start_date = temp[temp[time] <= end_date].sort_values(by=tittle, ascending=False).iloc[0][
        time]
    # 将无关的变量删除
    temp.drop(['max2here', 'dd2here'], axis=1, inplace=True)
    results.loc[0, '最大回撤'] = format(max_draw_down, '.2%')
    results.loc[0, '最大回撤开始时间'] = str(start_date)
    results.loc[0, '最大回撤结束时间'] = str(end_date)

    # ===年化收益/回撤比：我个人比较关注的一个指标
    results.loc[0, '年化收益/回撤比'] = round(annual_return / abs(max_draw_down), 2)

    # ===计算年度收益率
    yearly_returns = calculate_yearly_returns(temp, tittle, time)
    results.loc[0, '年度收益详情'] = str(yearly_returns)

    return results.T

def calculate_yearly_returns(data, value_col, time_col):
    """
    计算年度收益率

    Args:
        data (pd.DataFrame): 包含净值数据的DataFrame
        value_col (str): 净值列名
        time_col (str): 时间列名

    Returns:
        dict: 年度收益率字典
    """
    # 复制数据并确保时间格式正确
    df = data.copy()
    df[time_col] = pd.to_datetime(df[time_col])

    # 提取年份
    df['year'] = df[time_col].dt.year

    # 获取所有年份
    years = sorted(df['year'].unique())

    yearly_returns = {}

    for year in years:
        # 获取该年的数据
        year_data = df[df['year'] == year]

        if len(year_data) == 0:
            continue

        # 获取年初和年末净值
        year_start = year_data[value_col].iloc[0]
        year_end = year_data[value_col].iloc[-1]

        # 计算年度收益率
        if year_start != 0:
            year_return = (year_end / year_start - 1) * 100
        else:
            year_return = 0

        yearly_returns[year] = round(year_return, 2)

    return yearly_returns
